#include "_UI.h"

#include <algorithm>

#include "../_Luly.h"
#include "LulyUI.h"

void _UI::init() {
  for (int i = 0; i < ui_object_list.getSize(); i++) {
    if (ui_object_list[i].second != nullptr) {
      ui_object_list[i].second->init();
    }
  }
}

void _UI::event() {
  // for (std::pair<std::string, UIObject*> ui_object : ui_object_list) {
  //   if (ui_object.second != nullptr && ui_object.second->enable == true) {
  //     ui_object.second->event();
  //   }
  // }
  for (int i = 0; i < ui_object_list.getSize(); i++) {
    if (ui_object_list[i].second != nullptr &&
        ui_object_list[i].second->enable == true) {
      ui_object_list[i].second->event();
    }
  }
}

void _UI::update() {
  for (int i = 0; i < ui_object_list.getSize(); i++) {
    if (ui_object_list[i].second != nullptr &&
        ui_object_list[i].second->enable == true) {
      ui_object_list[i].second->updateContentData();
      ui_object_list[i].second->update();
    }
  }
}

void _UI::draw() {
  // for (std::pair<std::string, UIObject*> ui_object : ui_object_list) {
  // }
  for (int i = 0; i < ui_object_list.getSize(); i++) {
    if (ui_object_list[i].second != nullptr &&
        ui_object_list[i].second->enable == true) {
      ui_object_list[i].second->drawArea(
          Rect{0, 0, _Luly::getInstance().windowWidth,
               _Luly::getInstance().windowHeight});
    }
  }
}

_UI::~_UI() {
  for (int i = 0; i < ui_object_list.getSize(); i++) {
    if (ui_object_list[i].second != nullptr) {
      delete ui_object_list[i].second;
      ui_object_list[i].second = nullptr;
    }
  }
}

//===============================================
//一下为LulyUI包裹_UI的一些方法及其原型
//===============================================

//_UI的入口（给LulyUI调用）
//如果不用入口直接用_UI的话，会导致没有效果
//因为_UI类是单例类
//虽然也可以用_UI::getInstance()但是这样效率不高
static _UI& _ui_instance = _UI::getInstance();

void _UI::addUIObject(UIObject* ui_object) {
  //不能为空指针
  if (ui_object != nullptr) {
    //判断是否已经存在
    if (ui_object_list.hasKey(ui_object->uiObjectId)) {
      printf("error:对象(id:%s)已存在\n", ui_object->uiObjectId.c_str());
      // throw;
    } else {
      ui_object_list.push_back(ui_object->uiObjectId, ui_object);
    }
  }
}

void LulyUI::addUIObject(UIObject* object) { _ui_instance.addUIObject(object); }

Font _UI::getDefaultFont() { return _ui_instance.defaultFont; }

Font LulyUI::getDefaultFont() { return _ui_instance.getDefaultFont(); }

void _UI::setDefaultFont(Font font) {
  // delete _ui_instance.defaultFont;  //先删除旧的Font防止内存泄漏
  _ui_instance.defaultFont = font;
}

void LulyUI::setDefaultFont(Font font) { _ui_instance.setDefaultFont(font); }

//=================================================